package jp.ac.u_tokyo.dch.action.data;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.dao.schema.DataSchemaDao;
import jp.ac.u_tokyo.dch.model.PageInfo;
import jp.ac.u_tokyo.dch.model.db.Data;
import jp.ac.u_tokyo.dch.model.db.DataSchema;
import jp.ac.u_tokyo.dch.service.DaoServiceAware;
import jp.ac.u_tokyo.dch.util.common.ModoruUtil;
import jp.ac.u_tokyo.dch.util.common.DataPageUtil;
import jp.ac.u_tokyo.dch.view.outputdata.SearchView;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* データ検索処理
* @version 1.1
*
*/
public class DataMentenanceAction extends ActionSupport implements ModelDriven<SearchView>,  DaoServiceAware {

	/**
	 *シリアル番号
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * ポップアップサイン：１（ポップアップ）
	 */
	private static final String POPUP = "1";
	 /**
	 * DBコネクションオブジェクト
	 */
	private DBConnection dbConnection = null;

	/**
	 * ページ状態保存オブジェクト
	 */
	private PageInfo<Data> pageInfo;

	/**
	 * ポップアップサイン
	 */
	private String popupSign = null;

	/**
	 * スキーマオプションリスト
	 */
	private List<DataSchema> optionList;

	 /**
	 * 画面モデル
	 */
	private SearchView view = new SearchView();

	/**
	 * 初期化処理
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String init() throws Exception {

		DataSchemaDao dataSchemaDao = new DataSchemaDao(dbConnection);

		optionList = dataSchemaDao.selectList(view.getDataType());

		return SUCCESS;
	}

	/**
	 * 初期検索処理（1回目でページ情報初期化）
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String search() throws Exception {

		if (!POPUP.equals(popupSign)) {

			ModoruUtil.modoruProcess(ServletActionContext.getRequest(),
					"/outputdata/searchstate",ServletActionContext.getRequest().getQueryString());
		}

		view.setCurrentPage("1");

		searchProcess();


		return SUCCESS;
	}
	/**
	 * 検索処理
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String searchState() throws Exception {

		ModoruUtil.modoruProcess(ServletActionContext.getRequest(),
				"/outputdata/searchstate",ServletActionContext.getRequest().getQueryString());

		searchProcess();

		return SUCCESS;

	}

	/**
	 * ポップアップで呼び出される場合（データ登録する場合）
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String popupIndex() throws Exception {

		popupSign = POPUP;

		HttpServletRequest request = ServletActionContext.getRequest();
		String sort = request.getParameter("sort");
		String schemaid = request.getParameter("schemaid");

		DataSchemaDao dataSchemaDao = new DataSchemaDao(dbConnection);

		optionList = dataSchemaDao.selectList(sort);
		DataSchema schema = dataSchemaDao.selectObject(schemaid);

		view.setSchemaid(schema.getOyaschemaid());
		view.setDataType(sort);

		return SUCCESS;
	}


	/**
	 * 検索共通処理
	 * @throws Exception 例外
	 */
	private void searchProcess() throws Exception {

		DataPageUtil pageUtil = new DataPageUtil(dbConnection);
		DataSchemaDao dataSchemaDao = new DataSchemaDao(dbConnection);

		String currentPage = view.getCurrentPage();
		String viewPageCnt = view.getViewPageCnt();

		Map<String,String> searchKeyMap = new HashMap<String, String>();
		searchKeyMap.put("dataType", view.getDataType());
		searchKeyMap.put("schemaid", view.getSchemaid());
		searchKeyMap.put("keyword", view.getKeyword());
		searchKeyMap.put("popupSign", popupSign);

		pageInfo = pageUtil.createPageInfo(currentPage, viewPageCnt, searchKeyMap);
		optionList = dataSchemaDao.selectList(view.getDataType());


	}

	/**
	 * 分類セット
	 * @param sort
	 * @return 分類
	 */
	public String getSortName(String sort) {

		return getText("outputmenu_" + sort);
	}
	public List<DataSchema> getOptionList() {
		return optionList;
	}

	/**
	 * ポップアップサイン
	 * @return
	 */
	public String getPopupSign() {
		return popupSign;
	}

	public void setPopupSign(String popupSign) {
		this.popupSign = popupSign;
	}

	public PageInfo<Data> getPage() {
		return pageInfo;
	}
	@Override
	public void setDBConnection(DBConnection con) {
		dbConnection = con;
	}

	@Override
	public SearchView getModel() {
		return view;
	}
}
